/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.general.be;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.ColegiadoImagen;
import org.cip.esymons.colegiatura.be.DetalleGuia;
import org.cip.esymons.colegiatura.be.Preinscripcion;
import org.cip.esymons.eventos.be.PreinscripcionEvento;
import org.cip.esymons.tesoreria.be.BeneficiarioFondoMortuorio;
import org.cip.esymons.tesoreria.be.BeneficiarioPagocolegiatura;
import org.cip.esymons.tesoreria.be.RecepcionadorCertificado;

/**
 *
 * @author OscarA
 */
@Entity
@Table(name = "gen_persona_natural")
@DiscriminatorValue("PN")
@PrimaryKeyJoinColumn(name = "per_codigo", referencedColumnName = "sol_codigo")
//@NamedQueries({@NamedQuery(name = "PersonaNatural.findAll", query = "SELECT p FROM PersonaNatural p"), @NamedQuery(name = "PersonaNatural.findByPerapellidoPaterno", query = "SELECT p FROM PersonaNatural p WHERE p.perapellidoPaterno = :perapellidoPaterno"), @NamedQuery(name = "PersonaNatural.findByPerapellidoMaterno", query = "SELECT p FROM PersonaNatural p WHERE p.perapellidoMaterno = :perapellidoMaterno"), @NamedQuery(name = "PersonaNatural.findByPerNombres", query = "SELECT p FROM PersonaNatural p WHERE p.perNombres = :perNombres"), @NamedQuery(name = "PersonaNatural.findByPerSexo", query = "SELECT p FROM PersonaNatural p WHERE p.perSexo = :perSexo"), @NamedQuery(name = "PersonaNatural.findByPerfechaNacimiento", query = "SELECT p FROM PersonaNatural p WHERE p.perfechaNacimiento = :perfechaNacimiento"), @NamedQuery(name = "PersonaNatural.findByPerActivo", query = "SELECT p FROM PersonaNatural p WHERE p.perActivo = :perActivo"), @NamedQuery(name = "PersonaNatural.findByPerfechaRegistro", query = "SELECT p FROM PersonaNatural p WHERE p.perfechaRegistro = :perfechaRegistro"), @NamedQuery(name = "PersonaNatural.findByPertieneImagen", query = "SELECT p FROM PersonaNatural p WHERE p.pertieneImagen = :pertieneImagen")})
public class PersonaNatural extends Solicitante implements Serializable {

    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "per_apellidoPaterno", nullable = false, length = 50)
    private String perapellidoPaterno;
    @Basic(optional = false)
    @Column(name = "per_apellidoMaterno", nullable = false, length = 50)
    private String perapellidoMaterno;
    @Basic(optional = false)
    @Column(name = "per_nombres", nullable = false, length = 80)
    private String perNombres;
    @Basic(optional = false)
    @Column(name = "per_sexo", nullable = false)
    private boolean perSexo;
    @Basic(optional = false)
    @Column(name = "per_fechaNacimiento", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date perfechaNacimiento;
    @Basic(optional = false)
    @Column(name = "per_activo", nullable = false)
    private boolean perActivo;
    @Basic(optional = false)
    @Column(name = "per_fechaRegistro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date perfechaRegistro = new Date();
    @Basic(optional = false)
    @Column(name = "per_tieneImagen", nullable = false)
    private boolean pertieneImagen;
    @Basic(optional = false)
    @Column(name = "per_especTemp", nullable = false, length = 80)
    private String perEspecialidad;
    @Basic(optional = false)
    @Column(name = "per_tipo", nullable = false)
    private int perTipo;
    @Basic(optional = false)
    @Column(name = "per_estadoCivil", nullable = false)
    private Integer perestadoCivil;
    @Column(name = "per_nroDni", nullable = false)
    private String perNroDNI;
    @Column(name = "per_nroPasaporte", nullable = false)
    private String perNroPasaporte;
    @Column(name = "per_lugarNacimiento", nullable = false)
    private String perlugarNacimiento;
    @Transient
    private boolean seleccionado;
    @Transient
    private DireccionPersona direccion;
    @Transient
    private ConsejoDepartamental consejo;
    @JoinColumn(name = "nac_codigo", referencedColumnName = "nac_codigo", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Nacionalidad nacionalidad;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "perCodigo", fetch = FetchType.LAZY)
    private List<Preinscripcion> preInscripcionCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "personaNatural", fetch = FetchType.LAZY)
    private List<RecepcionadorCertificado> recepcionadorCertificadoCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "personaBeneficiaria", fetch = FetchType.LAZY)
    private List<BeneficiarioFondoMortuorio> ListaBeneficiariosFondoMortuorio;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "personaNatural", fetch = FetchType.LAZY)
    private List<BeneficiarioPagocolegiatura> beneficiarioPagocolegiaturaCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "personaNatural", fetch = FetchType.LAZY)
    private List<PreinscripcionEvento> preInscripcionEventoCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "colCodigo", fetch = FetchType.LAZY)
    private List<DetalleGuia> listaDetalleGuia;
//    @OneToOne(cascade = CascadeType.ALL, mappedBy = "personaNatural", fetch = FetchType.LAZY)
//    private Colegiado colegiado;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "personaNatural", fetch = FetchType.LAZY)
    private Colegiado colegiado;

    public List<DetalleGuia> getListaDetalleGuia() {
        return listaDetalleGuia;
    }

    public void setListaDetalleGuia(List<DetalleGuia> listaDetalleGuia) {
        this.listaDetalleGuia = listaDetalleGuia;
    }

    //william
    public DireccionPersona getDireccion() {
        return direccion;
    }

    public void setDireccion(DireccionPersona direccion) {
        this.direccion = direccion;
    }

    public PersonaNatural() {
    }

    public ConsejoDepartamental getConsejo() {
        return consejo;
    }

    public void setConsejo(ConsejoDepartamental consejo) {
        this.consejo = consejo;
    }

    public PersonaNatural(Long perCodigo, String perapellidoPaterno, String perapellidoMaterno,
            String perNombres, boolean perSexo, Date perfechaNacimiento, boolean perActivo,
            Date perfechaRegistro, boolean pertieneImagen, int perestadoCivil) {
        solCodigo = perCodigo;
        this.perapellidoPaterno = perapellidoPaterno;
        this.perapellidoMaterno = perapellidoMaterno;
        this.perNombres = perNombres;
        this.perSexo = perSexo;
        this.perfechaNacimiento = perfechaNacimiento;
        this.perActivo = perActivo;
        this.perfechaRegistro = perfechaRegistro;
        this.pertieneImagen = pertieneImagen;
        this.perestadoCivil = perestadoCivil;
    }

    public String getPerlugarNacimiento() {
        return perlugarNacimiento;
    }

    public void setPerlugarNacimiento(String perlugarNacimiento) {
        this.perlugarNacimiento = perlugarNacimiento;
    }

    public List<Preinscripcion> getPreInscripcionCollection() {
        return preInscripcionCollection;
    }

    public void setPreInscripcionCollection(List<Preinscripcion> preInscripcionCollection) {
        this.preInscripcionCollection = preInscripcionCollection;
    }

    public String getPerEspecialidad() {
        return perEspecialidad;
    }

    public void setPerEspecialidad(String perEspecialidad) {
        this.perEspecialidad = perEspecialidad;
    }

    public Nacionalidad getNacionalidad() {
        return nacionalidad;
    }

    public void setNacionalidad(Nacionalidad nacionalidad) {
        this.nacionalidad = nacionalidad;
    }

    public List<PreinscripcionEvento> getPreInscripcionEventoCollection() {
        return preInscripcionEventoCollection;
    }

    public void setPreInscripcionEventoCollection(List<PreinscripcionEvento> preInscripcionEventoCollection) {
        this.preInscripcionEventoCollection = preInscripcionEventoCollection;
    }

    public List<BeneficiarioPagocolegiatura> getBeneficiarioPagocolegiaturaCollection() {
        return beneficiarioPagocolegiaturaCollection;
    }

    public void setBeneficiarioPagocolegiaturaCollection(List<BeneficiarioPagocolegiatura> beneficiarioPagocolegiaturaCollection) {
        this.beneficiarioPagocolegiaturaCollection = beneficiarioPagocolegiaturaCollection;
    }

    public List<RecepcionadorCertificado> getRecepcionadorCertificadoCollection() {
        return recepcionadorCertificadoCollection;
    }

    public int getPerTipo() {
        return perTipo;
    }

    public void setPerTipo(int perTipo) {
        this.perTipo = perTipo;
    }

    public void setRecepcionadorCertificadoCollection(List<RecepcionadorCertificado> recepcionadorCertificadoCollection) {
        this.recepcionadorCertificadoCollection = recepcionadorCertificadoCollection;
    }

    public String getPerapellidoPaterno() {
        return perapellidoPaterno;
    }

    public void setPerapellidoPaterno(String perapellidoPaterno) {
        this.perapellidoPaterno = perapellidoPaterno.toUpperCase();
    }

    public String getPerapellidoMaterno() {
        return perapellidoMaterno;
    }

    public void setPerapellidoMaterno(String perapellidoMaterno) {
        this.perapellidoMaterno = perapellidoMaterno.toUpperCase();
    }

    public String getPerNombres() {
        return perNombres;
    }

    public void setPerNombres(String perNombres) {
        this.perNombres = perNombres.toUpperCase();
    }

    public boolean getPerSexo() {
        return perSexo;
    }

    public void setPerSexo(boolean perSexo) {
        this.perSexo = perSexo;
    }

    public Date getPerfechaNacimiento() {
        return perfechaNacimiento;
    }

    public void setPerfechaNacimiento(Date perfechaNacimiento) {
        this.perfechaNacimiento = perfechaNacimiento;
    }

    public boolean getPerActivo() {
        return perActivo;
    }

    public void setPerActivo(boolean perActivo) {
        this.perActivo = perActivo;
    }

    public Date getPerfechaRegistro() {
        return perfechaRegistro;
    }

    public void setPerfechaRegistro(Date perfechaRegistro) {
        this.perfechaRegistro = perfechaRegistro;
    }

    public boolean getPertieneImagen() {
        return pertieneImagen;
    }

    public void setPertieneImagen(boolean pertieneImagen) {
        this.pertieneImagen = pertieneImagen;
    }

    public Integer getPerestadoCivil() {
        return perestadoCivil;
    }

    public void setPerestadoCivil(Integer perestadoCivil) {
        this.perestadoCivil = perestadoCivil;
    }

    public String getNombreCompleto() {
        String nombre = "";
        try {
            return nombre = perNombres + " " + perapellidoPaterno + " " + perapellidoMaterno;
        } catch (Exception ex) {
            return null;
        }
    }

    public String getApellidosNombres() {
        try {
            return perapellidoPaterno + " " + perapellidoMaterno + ", " + perNombres;
        } catch (Exception ex) {
            return null;
        }
    }

    public String getNombreCompletoPersona() {
        try {
            return perapellidoPaterno + " " + perapellidoMaterno + " " + perNombres;
        } catch (Exception ex) {
            return null;
        }
    }

    public String getNombreColegiado() {
        try {
            return perapellidoPaterno + " " + perapellidoMaterno + " " + perNombres;
        } catch (Exception ex) {
            return null;
        }
    }

    public String getApellidoPersona() {

        return perapellidoPaterno + " " + perapellidoMaterno;
    }

    public String getNombreApellido() {

        String[] nombre;
        nombre = perNombres.split(" ");

        return nombre[0] + " " + perapellidoPaterno;
    }

    public String getNombreApellidoTemporal() {

        String[] nombre;
        nombre = perNombres.split(" ");

        return nombre[0] + " " + perapellidoPaterno + " " + perapellidoMaterno;
    }

    public String getEsCivil() {
        String retorno = "";
        if(perestadoCivil == null){
            retorno ="NN";
        }
        switch (perestadoCivil) {
            case 1:
                retorno = "Soltero";
                break;
            case 2:
                retorno = "Casado";
                break;
            case 3:
                retorno = "Divorciado";
                break;
            case 4:
                retorno = "Viudo";
                break;

        }
        return retorno;
    }

    public String getSexoPersona() {

        String sexo = "";
        if (perSexo == true) {
            sexo = "Masculino";
        } else {
            sexo = "Femenino";
        }
        return sexo;
    }

    public String getFechaNacimiento() {

        String day, m, anno, fechanac = null;
        SimpleDateFormat dia = new SimpleDateFormat("dd");
        dia.format(perfechaNacimiento);
        SimpleDateFormat mes = new SimpleDateFormat("MMMM");
        mes.format(perfechaNacimiento);
        SimpleDateFormat year = new SimpleDateFormat("yyyy");
        year.format(perfechaNacimiento);
        day = dia.format(new Date());
        m = mes.format(new Date());
        anno = year.format(new Date());
        fechanac = day + " de " + m + " de " + anno;
        return fechanac;

    }

    public String getFechaNacCol() {

        SimpleDateFormat sdfnc = new SimpleDateFormat("dd/MM/yyyy");
        return sdfnc.format(perfechaNacimiento);
    }
    public String getFechaCumpleagnos(){

        SimpleDateFormat fc = new SimpleDateFormat("dd-MMMM");
        return fc.format(perfechaNacimiento);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (solCodigo != null ? solCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof PersonaNatural)) {
            return false;
        }
        PersonaNatural other = (PersonaNatural) object;
        if ((this.solCodigo == null && other.solCodigo != null) || (this.solCodigo != null && !this.solCodigo.equals(other.solCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.cip.esymons.eventos.be.PersonaNatural[perCodigo=" + solCodigo + "]";
    }

    /**
     * @return the perNroDNI
     */
    public String getPerNroDNI() {
        return perNroDNI;
    }

    /**
     * @param perNroDNI the perNroDNI to set
     */
    public void setPerNroDNI(String perNroDNI) {
        this.perNroDNI = perNroDNI;
    }

    /**
     * @return the perNroPasaporte
     */
    public String getPerNroPasaporte() {
        return perNroPasaporte;
    }

    /**
     * @param perNroPasaporte the perNroPasaporte to set
     */
    public void setPerNroPasaporte(String perNroPasaporte) {
        this.perNroPasaporte = perNroPasaporte;
    }

    /**
     * @return the ListaBeneficiariosFondoMortuorio
     */
    public List<BeneficiarioFondoMortuorio> getListaBeneficiariosFondoMortuorio() {
        return ListaBeneficiariosFondoMortuorio;
    }

    /**
     * @param ListaBeneficiariosFondoMortuorio the ListaBeneficiariosFondoMortuorio to set
     */
    public void setListaBeneficiariosFondoMortuorio(List<BeneficiarioFondoMortuorio> ListaBeneficiariosFondoMortuorio) {
        this.ListaBeneficiariosFondoMortuorio = ListaBeneficiariosFondoMortuorio;
    }

    /**
     * @return the seleccionado
     */
    public boolean getSeleccionado() {
        return seleccionado;
    }

    /**
     * @param seleccionado the seleccionado to set
     */
    public void setSeleccionado(boolean seleccionado) {
        this.seleccionado = seleccionado;
    }

    /**
     * @return the colegiado
     */
    public Colegiado getColegiado() {
        return colegiado;
    }

    /**
     * @param colegiado the colegiado to set
     */
    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    @Transient
    private Boolean email;

    public Boolean getEmail() {
        return email;
    }

    public void setEmail(Boolean email) {
        this.email = email;
    }

    @Transient
    private Boolean emailCIP;

    public Boolean getEmailCIP() {
        return emailCIP;
    }

    public void setEmailCIP(Boolean emailCIP) {
        this.emailCIP = emailCIP;
    }

    @Transient
    private ColegiadoImagen foto;

    public ColegiadoImagen getFoto() {
        return foto;
    }

    public void setFoto(ColegiadoImagen foto) {
        this.foto = foto;
    }



}
